package com.atdel.demo23;


import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo23
 * @Author: Del
 * @CreateTime: 2025-03-19  09:34
 * @Description: 
 * 使用反射，创建一个学生类型的数组，存放二个学生，循环遍历输出，要求如下：
 *     1、第一个学生要求使用默认构造方法实例化并使用用 set 方法初始化对象
 *     2、第二个学生要求使用下面的构造方法实例化对象
 *         Student(String name,int age,Double score)
 * @Version: 1.0
 */
public class ReflectDemo {
    public static void main(String[] args) throws Exception {

        // 1. 创建数组
        Object o = Array.newInstance(Student.class, 2);

        // 2. 创建对象
        Class<Student> studentClass = Student.class;
        Object student01 = studentClass.newInstance();

        // 3. 设置值
        Method declaredMethod = studentClass.getDeclaredMethod("setName", String.class);
        declaredMethod.invoke(student01, "张三");
        Method declaredMethod1 = studentClass.getDeclaredMethod("setAge", int.class);
        declaredMethod1.invoke(student01, 18);
        Method declaredMethod2 = studentClass.getDeclaredMethod("setScore", Double.class);
        declaredMethod2.invoke(student01, 99.9);

        // 添加数组
        Array.set(o, 0, student01);


        // 创建空参的构造方法实例化对象
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, int.class, Double.class);
        Object student02 = declaredConstructor.newInstance("李四", 19, 99.9);
        Array.set(o, 1, student02);


        // 遍历
        for (int i = 0; i < Array.getLength(o); i++) {
            Object student = Array.get(o, i);
            System.out.println(student);
        }

    }
}
